package org.windey.server.database;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 
 * klasse voor het genereren van een MD5-hash
 * (tenminste dat willen wij ermee, dus steken we in het hashType een md5)
 *
 */
public class Md5Generator {
	
	/**
	 * we houden het hashtype bij.
	 */
	private MessageDigest md;
	
	public Md5Generator() {
		try {
			setMd(MessageDigest.getInstance("MD5"));
		} 
		catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @param md type van hash dat je wilt gebruiken. 
	 */
	public void setMd(MessageDigest md) {
		this.md = md;
	}

	/**
	 * 
	 * @return het ingestelde hash-type
	 */
	public MessageDigest getMd() {
		return md;
	}
	
	/**
	 * genereert van de ingegeven String een md5-hash
	 * @param input de gegevens die je wilt hashen
	 * @return de gehashte gegegevens
	 */
	public String generateMD5(String input) {
		byte[] md5hash = new byte[32];
		md.update(input.getBytes(), 0, input.length());
		md5hash = md.digest();
		return bytesToString(md5hash);
	}
	
	
	private String bytesToString(byte[] data) {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < data.length; i++) {
			int halfbyte = (data[i] >>> 4) & 0x0F;
			int two_halfs = 0;
			do {
				if ((0 <= halfbyte) && (halfbyte <= 9)) {
					buf.append((char) ('0' + halfbyte));
				}
				else {
					buf.append((char) ('a' + (halfbyte - 10)));
				}
				halfbyte = data[i] & 0x0F;
			}
			while(two_halfs++ < 1);
			}
		return buf.toString();
		
	}

}
